/**
 * @file VisualMonitor.h
 * @author enemy1205 (enemy1205@qq.com)
 * @brief 视觉监视类头文件
 * @date 2021-09-15
 *
 */
#pragma once

#include "ArmorDetect.h"
#include "RuneDetect.h"
#include "ArmorTrack.h"
#include "RuneTrack.h"
#include "Predict.h"
#include "Judge.h"
#include <deque>

//由于每个装甲板单独分配一个Tracker，而识别器Detector则是捕获每帧内目标，故分开处理,每次由Detector递交至Tracker处理
//Visual存储trackers,每帧detector;
class Visual {
public:
    //默认构造函数初始化
    Visual();

    //更新此帧所有信息
    virtual Point2f updateFrame(Mat &, GyroData &) { return total_move; };

    //获取最近的追踪器
    tracker_ptr getClosedTracker();

    //更新此帧追踪器信息
    virtual void updateTrackers() = 0;

    //为匹配到序列的对象更新位姿信息
    virtual cv::Point2f updateInfo() { return cv::Point2f(0, 0); };

    //窗口展示
    inline void show() { detector->show(Other_param.Time_per_frame); }

    //第一次按ESC暂停，按其余键恢复运行，再次按ESC则会退出
    bool exit() {
        if (detector->c == 27) {
            if (cv::waitKey(0) == 27)
                return true;
            else return false;
        } else return false;
    }

protected:
    GyroData_ptr gyroData;              //陀螺仪数据
    clock_t appear_time;                //出现时间
    cv::Point2f total_move;             //位移
    Predict_ptr predictor;              //预测管理器
    Judge_ptr   judger;                 //决策器
    Compensate_ptr compensator;         //补偿器
    vector<tracker_ptr> trackers;       //特征类追踪器
    std::shared_ptr<Detector> detector; //特征类识别指针
};

//自瞄程序部分
class AutoAim : public Visual {
public:
    AutoAim();

    Point2f updateFrame(Mat &, GyroData &) override;

    void updateTrackers() override;

    cv::Point2f updateInfo() override;

};

//能量机关程序部分
class BuffActivate : public Visual {
public:
    BuffActivate();

    Point2f updateFrame(Mat &, GyroData &) override;

    void updateTrackers() override;

    cv::Point2f updateInfo() override;

};